/**
 * 智谱AI (GLM-4) API调用工具
 * 提供集成GLM-4模型的API调用功能
 */

// 导入JWT工具和API密钥管理器
const jwt = require('./jwt');
const apikeyManager = require('./apikey_manager');

// 智谱AI API 配置
const ZHIPU_API_CONFIG = {
  apiKey: '', // 默认为空，从管理器加载
  apiUrl: 'https://open.bigmodel.cn/api/paas/v4/chat/completions', // API端点
  model: 'glm-4-air-250414' // 默认模型
};

// 初始化配置，加载API密钥
function initConfig() {
  // 从本地存储加载API密钥，默认使用预设密钥
  ZHIPU_API_CONFIG.apiKey = apikeyManager.loadApiKey('ace84bce9f50497693a1dadc70376e93.tHdKXI4dM114btUX');
  console.log('智谱AI配置已初始化');
}

// 初始化配置
initConfig();

/**
 * 调用智谱AI API
 * @param {Array<Object>} messages 消息数组，格式为[{role: 'user', content: '你好'}]
 * @param {Object} options 配置选项
 * @param {String} options.model 模型名称，默认为glm-4-air-250414
 * @param {String} options.apiKey 智谱API密钥，默认使用配置的密钥
 * @param {Boolean} options.stream 是否使用流式输出，默认为false
 * @param {Function} options.onSuccess 成功回调
 * @param {Function} options.onError 错误回调
 * @param {Function} options.onComplete 完成回调
 * @returns {Promise} 请求Promise
 */
function callZhipuAPI(messages, options) {
  if (!options) options = {};
  
  return new Promise(function(resolve, reject) {
    const apiKey = options.apiKey || ZHIPU_API_CONFIG.apiKey;
    if (!apiKey) {
      const errorMsg = '智谱AI API密钥未设置!';
      console.error(errorMsg);
      
      // 直接使用模拟数据
      if (options.fallbackToMock) {
        console.log('API密钥未设置，使用模拟数据');
        const mockResponse = getMockData(options.mockType || 'default');
        if (options.onSuccess) options.onSuccess(mockResponse, {mock: true});
        resolve(mockResponse);
        return;
      }
      
      if (options.onError) options.onError(errorMsg);
      reject(new Error(errorMsg));
      return;
    }

    // 使用jwt工具获取token
    try {
      jwt.getTokenFromBackend(apiKey, function(token) {
        if (!token) {
          const errorMsg = '无法生成有效的授权token';
          console.error(errorMsg);
          
          // 使用模拟数据
          if (options.fallbackToMock) {
            console.log('无法生成token，使用模拟数据');
            const mockResponse = getMockData(options.mockType || 'default');
            if (options.onSuccess) options.onSuccess(mockResponse, {mock: true});
            resolve(mockResponse);
            return;
          }
          
          if (options.onError) options.onError(errorMsg);
          reject(new Error(errorMsg));
          return;
        }

        // 请求参数
        const requestData = {
          model: options.model || ZHIPU_API_CONFIG.model,
          messages: messages,
          stream: options.stream || false,
          temperature: options.temperature || 0.7,
          top_p: options.top_p || 0.9,
          request_id: 'wx_' + Date.now()
        };

        // 可选参数
        if (options.max_tokens) requestData.max_tokens = options.max_tokens;

        console.log('发送请求至智谱AI:', ZHIPU_API_CONFIG.apiUrl);
        console.log('请求模型:', requestData.model);

        // 使用智谱AI标准的身份验证格式 - 使用id作为请求头中的api-key
        const idParts = apiKey.split('.');
        const id = idParts[0];
        
        wx.request({
          url: ZHIPU_API_CONFIG.apiUrl,
          method: 'POST',
          timeout: 30000, // 30秒超时
          header: {
            'Content-Type': 'application/json',
            'Authorization': token.includes('.')
              ? 'Bearer ' + token // 如果是JWT格式
              : 'Bearer ' + apiKey // 否则直接使用apiKey
          },
          data: requestData,
          success: function(res) {
            console.log('智谱AI响应状态码:', res.statusCode);
            
            if (res.statusCode === 200 && res.data && res.data.choices && 
                res.data.choices[0] && res.data.choices[0].message && 
                res.data.choices[0].message.content) {
              const aiResponse = res.data.choices[0].message.content.trim();
              if (options.onSuccess) options.onSuccess(aiResponse, res.data);
              resolve(aiResponse);
            } else {
              // 处理错误响应
              const errorCode = res.statusCode;
              const errorData = res.data && res.data.error ? res.data.error : res.data;
              let errorMsg = '';
              
              if (errorCode === 429) {
                errorMsg = '请求频率超限，请稍后再试 (429)';
              } else if (errorCode === 401 || (errorData && (errorData.code === "1000" || errorData.code === "401"))) {
                errorMsg = 'API密钥认证失败: ' + (errorData && errorData.message ? errorData.message : '请检查密钥配置');
                
                // 如果是认证错误，尝试提示用户更新API密钥
                if (options.apiKey === ZHIPU_API_CONFIG.apiKey) {
                  console.warn('默认API密钥认证失败，建议更新密钥');
                }
                
                // 尝试使用模拟数据
                if (options.fallbackToMock) {
                  console.log('认证失败，使用模拟数据');
                  const mockResponse = getMockData(options.mockType || 'default');
                  if (options.onSuccess) options.onSuccess(mockResponse, {mock: true});
                  resolve(mockResponse);
                  return;
                }
              } else {
                errorMsg = 'AI响应错误: ' + res.statusCode + ' ' + (errorData && errorData.message ? errorData.message : '未知错误');
              }
              
              console.error('API错误:', errorMsg);
              console.error('错误详情:', errorData);
              
              // 在所有API错误情况下都尝试使用模拟数据
              if (options.fallbackToMock) {
                console.log('API错误，使用模拟数据');
                const mockResponse = getMockData(options.mockType || 'default');
                if (options.onSuccess) options.onSuccess(mockResponse, {mock: true});
                resolve(mockResponse);
                return;
              }
              
              if (options.onError) options.onError(errorMsg, errorData);
              reject(new Error(errorMsg));
            }
          },
          fail: function(err) {
            const errorMsg = '网络请求失败，请稍后再试';
            console.error('请求智谱AI API失败:', err);
            
            // 网络请求失败时，尝试使用模拟数据
            if (options.fallbackToMock) {
              console.log('网络请求失败，使用模拟数据');
              const mockResponse = getMockData(options.mockType || 'default');
              if (options.onSuccess) options.onSuccess(mockResponse, {mock: true});
              resolve(mockResponse);
              return;
            }
            
            if (options.onError) options.onError(errorMsg, err);
            reject(new Error(errorMsg));
          },
          complete: function() {
            if (options.onComplete) options.onComplete();
          }
        });
      });
    } catch (e) {
      console.error('JWT生成异常:', e);
      // 处理JWT生成异常
      if (options.fallbackToMock) {
        console.log('JWT异常，使用模拟数据');
        const mockResponse = getMockData(options.mockType || 'default');
        if (options.onSuccess) options.onSuccess(mockResponse, {mock: true});
        resolve(mockResponse);
      } else if (options.onError) {
        options.onError('JWT生成失败: ' + e.message);
        reject(e);
      }
    }
  });
}

/**
 * 更新API密钥
 * @param {String} newApiKey 新的API密钥
 * @returns {Boolean} 是否更新成功
 */
function updateApiKey(newApiKey) {
  if (!apikeyManager.validateApiKeyFormat(newApiKey)) {
    console.error('API密钥格式无效');
    return false;
  }
  
  ZHIPU_API_CONFIG.apiKey = newApiKey;
  apikeyManager.saveApiKey(newApiKey);
  console.log('API密钥已更新');
  return true;
}

/**
 * 获取特定类型的模拟数据
 * @param {String} type - 模拟数据类型
 * @returns {String} 模拟响应数据
 */
function getMockData(type) {
  const mockData = {
    crowd: '当前:\n一楼窗口: 一般 人流适中，等待时间约5-10分钟\n二楼自选区: 空闲 人流较少，无需排队\n三楼特色餐: 拥挤 学生较多，等待时间约15分钟\n预测(半小时后):\n一楼窗口: 拥挤 即将迎来用餐高峰\n二楼自选区: 一般 人流将逐渐增加\n三楼特色餐: 一般 人流将有所减少',
    recommend: '麻婆豆腐\n清蒸鲈鱼\n紫菜蛋花汤\n清炒时蔬\n米饭',
    nutrition: '蛋白质丰富，脂肪适中，碳水较为均衡。建议增加一些粗粮，降低油脂摄入。',
    weather: '检测到明天有雨，请记得提前收好阳台晾晒的衣物。',
    utility: '根据历史用量和人数，建议每人分摊 ￥ 21.40。',
    repair: '检测到问题为"水龙头漏水"，已通知水电维修师傅。',
    // 活动策划相关模拟数据
    activity_ideas: '创意: 互动式破冰游戏晚会，可行性高，预算充足。\n\n推荐场地: 学生活动中心多功能厅，容纳50人适宜。\n\n校内资源: 学生会文艺部可提供音响设备和演出支持。',
    activity_schedule: '根据团队成员时间安排分析，建议在周五晚上7:00-9:00召开筹备会议，所有成员均可出席。',
    activity_promotion: '建议采用以下宣传策略：校园朋友圈推文，各班级群内推送，在教学楼和食堂设置展板。预计参与人数80-120人',
    // 生涯规划相关模拟数据
    career_interest: '根据你的兴趣和能力分析，推荐以下职业方向：\n\n1. 软件工程师 (92% 匹配)\n职业特点：逻辑思维强，解决问题能力强，对技术有热情\n\n2. 产品经理 (85% 匹配)\n职业特点：创新思维，沟通协调能力，用户体验敏感\n\n3. UI/UX设计师 (80% 匹配)\n职业特点：审美能力强，关注用户体验，创造力丰富',
    resume_advice: '简历优化建议：\n\n1. 技能描述：建议量化项目经验，例如"将项目加载时间优化了30%"\n\n2. 排版布局：教育背景部分可以适当后移，突出项目经验\n\n3. 关键词：针对"软件工程师"岗位，可增加"分布式系统"、"微服务"等关键词',
    interview_feedback: '模拟面试反馈：\n\n优点：对行业有一定理解，表达流畅\n\n待改进：回答行为问题时缺乏STAR原则应用，需要更具体的案例支撑\n\n建议：准备3-5个具体的项目案例，包含挑战、行动和结果',
    industry_trend: '行业：人工智能\n\n趋势分析：近三年人才需求持续高速增长，热点领域包括大语言模型、计算机视觉。主要需求城市：北京、上海、深圳、杭州。\n\n薪资水平：应届生平均15K-20K，3年经验25K-35K，5年以上经验35K+',
    default: '这是一条模拟数据，实际API调用将返回真实结果。'
  };

  return mockData[type] || mockData.default;
}

// 导出模块函数
module.exports = {
  callZhipuAPI,
  getMockData,
  ZHIPU_API_CONFIG,
  updateApiKey
}; 